package generator

import (
	"fmt"
	"runtime"

	"github.com/tal-tech/go-zero/tools/goctl/util/console"
	"github.com/tal-tech/go-zero/tools/goctl/util/env"
)

// DefaultGenerator defines the environment needs of rpc service generation
type DefaultGenerator struct {
	log console.Console
}

// just test interface implement
var _ Generator = (*DefaultGenerator)(nil)

// NewDefaultGenerator returns an instance of DefaultGenerator
func NewDefaultGenerator() Generator {
	log := console.NewColorConsole()
	return &DefaultGenerator{
		log: log,
	}
}

// Prepare provides environment detection generated by rpc service,
// including go environment, protoc, whether protoc-gen-go is installed or not
func (g *DefaultGenerator) Prepare() error {
	if !env.CanExec() {
		return fmt.Errorf("%s: can not start new processes using os.StartProcess or exec.Command", runtime.GOOS)
	}

	if _, err := env.LookUpGo(); err != nil {
		return err
	}

	if _, err := env.LookUpProtoc(); err != nil {
		return err
	}

	_, err := env.LookUpProtocGenGoctl()
	if err == nil {
		return nil
	}

	g.log.Warning("%+v", err)
	_, err = env.LookUpProtocGenGo()
	return err
}
